#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
void foo()
{
    fprintf(stdout, "foo says bye.\n");
}
void bar()
{
    fprintf(stdout, "bar says bye.\n");
    /*当执行到某个清理函数时，若收到致命信号或清理函数调用了`_exit()`函数，那么清理函数不会返回，从而导致后面的清理函数被放弃。*/
    _exit(0);
}
int main(int argc, char *args[])
{
    atexit(foo);
    atexit(bar);
    /*系统采用行缓冲，又由于输出无换行符，因此exit()和return时可以正常输出它，但是_exit()不会输出它*/
    fprintf(stdout, "Oops .... forgot a newline!");
    sleep(2);
    if (argc > 1 && strcmp(args[1], "exit") == 0)
    {
        /*使用return退出时效果和exit()一样，会执行回调函数和冲刷缓冲区*/
        exit(0);
    }
    if (argc > 1 && strcmp(args[1], "_exit") == 0)
    {
        /*使用_exit()不会执行回调函数，也不会自己冲刷缓冲区*/
        _exit(0);
    }
    /*使用return退出时效果和exit()一样，会执行回调函数和冲刷缓冲区*/
    return 0;
}